package chapter;

/**
 * 方法与成员变量的隐藏
 * 对于重写是根据运行时引用所指向对象的实际类型来调用相关类的方法
 * 对于隐藏是根据引用的静态类型（编译时类型）来决定调用相关类的成员：例如：s引用的是父类的类型，因此调用父类的成员变量s与方法mStatic
 * 因为这种特征，我们访问静态成员变量时 总是通过类名来访问，而不是通过对象的引用来访问
 * 静态方法不能重写，只可以隐藏
 */
class SupperoverrideAndHidden{
    String s = "SuperOverriderAndHidden";
    public void mInstance(){
        System.out.println("mIntance() in SuperOverrideAndHidden");
    }
    public static void mStatic(){
        System.out.println("mStatic in SuperOverriderAndHidden");
    }
}

public class OverrideAndHidden extends SupperoverrideAndHidden{
    String s = "OverrideAndHidden";
    @Override
    public void mInstance(){
        System.out.println("mIntance() in OverrideAndHidden");
    }
    public static void mStatic(){
        System.out.println("mStatic in OverrideAndHidden");
    }

    public static void main(String[] args) {
        SupperoverrideAndHidden s = new SupperoverrideAndHidden();
        OverrideAndHidden oah = new OverrideAndHidden();
        System.out.println("父类SupperoverrideAndHidden的表现：");
        System.out.println(s.s);
        s.mInstance();
        s.mStatic();
        System.out.println("子类OverrideAndHidden的表现：");
        System.out.println(oah.s);
        oah.mInstance();
        oah.mStatic();
        s = oah;
        System.out.println("父类引用指向子类实例后，重载与重写的表现：");
        System.out.println(s.s);
        s.mInstance();
        s.mStatic();
    }
}
